/************************************Copyright (c)**************************************
                                          

--------------文件信息------------------------------------------------------------------
文 件 名: func_menu.c
创 建 人: Zhoucongwen
email:	  mcuast@qq.com
创建日期: 2019年04月15日
描    述: 菜单进程
---------- 版本信息---------------------------------------------------------------------
 版    本: V1.0
 说    明: 
----------------------------------------------------------------------------------------
Copyright(C) C.C. 2019/04/15
All rights reserved
****************************************************************************************/
#define FUNC_MENU_MAIN
#include "func_menu.h"
#include "func_oled.h"
#include "string.h"

#define LOCK_LEVEL_DEFAULT LOCK_LEVEL_UNLOCK

extern const void ***menus[];

//========================================================================================================
//密码页
//m_TXT(NAME,S,CTRL,X,Y)
//m_DATA_DISP(NAME,N,ADR,CTRL,X,Y,VP,DP)
//                 |0123456789ABCDEF|
m_TXT(PSD_L0,"  PassWord",DISP_CTRL_NML,0,2);			//定义静态文字
//--------------------------------------------------------------------------------
//#define m_DATA_SET(NAME,ADR,CTRL,Y,X,VP,DP,WADR,MIN,MAX)
m_DATA_SET(PSD_COMP,&g_menu.menu.psd_buf,DISP_CTRL_REV,2,6,VTP_U32,DTP_ZPUD(4,0),&g_menu.menu.psd_buf,0,9999);
//--------------------------------------------------------------------------------
const void * page_psd[]=
{
	
	&PSD_L0,
	&PSD_COMP,
	NULL
};


const void **pages_psd[]=
{
	page_psd,	
	NULL
};
//========================================================================================================

void func_self_chk(SELF_CHK_T *psc);

unsigned char func_menu_init(void)
{
	int i;
	
	FUNC_MENU_T *p;

	//---------------------------------------------------------
	p=&g_menu;										//菜单初始化
	p->menu.disp_buf=&g_func_oled.buf[0][0];			//显示文本缓存
	p->menu.dot_buf=&g_func_oled.lcd_dot_buf[0][0];	//显示点阵缓存
	p->menu.menus=menus;							//菜单数据
	p->menu.super_psd=2025;							//超级密码
	//p->menu.p_userpsd=&g_fsd.password;				//密码
	p->menu.p_userpsd=NULL;							//密码
	p->menu.pages_password=pages_psd;				//密码页
	p->menu.lock_level=LOCK_LEVEL_DEFAULT;				//锁定等级 
	for(i=0;;)
	{
		if(menus[i]==NULL)
		{
			break;
		}
		i++;
	}
	p->menu.menu_n=i;								//菜单数
	
	Menu_Mono_NewMenu(&p->menu,0,0);				//切换至menu0，page0
	//---------------------------------------------------------
	func_oled_Init(&g_func_oled);											//刷屏初始化
	
	func_key_init();														//按键初始化
	
	//Pr_FlashStore_Init(&g_pr_flashstore,&g_fsd,sizeof(g_fsd));			//储存初始化
	
	
	return(0);
}


const unsigned char tb_key_basic[]={
	KEY_CODE_NULL,			//KEY_CODE_NULL=0,	//0
	KEY_CODE_UP,			//KEY_CODE_UP,		//1
	KEY_CODE_DOWN,			//KEY_CODE_DOWN,	//2
	KEY_CODE_LEFT,			//KEY_CODE_LEFT,	//3
	KEY_CODE_RIGHT,			//KEY_CODE_RIGHT,	//X
	KEY_CODE_OK,			//KEY_CODE_OK,		//5
	KEY_CODE_CANCEL			//KEY_CODE_CANCEL,	//X
};


const unsigned char tb_key_sel[]={
	KEY_CODE_NULL,			//KEY_CODE_NULL=0,	//0
	KEY_CODE_UP,			//KEY_CODE_UP,		//1
	KEY_CODE_DOWN,			//KEY_CODE_DOWN,	//2
	KEY_CODE_UP,			//KEY_CODE_LEFT,	//3
	KEY_CODE_DOWN,			//KEY_CODE_RIGHT,	//X
	KEY_CODE_OK,			//KEY_CODE_OK,		//5
	KEY_CODE_CANCEL			//KEY_CODE_CANCEL,	//X
};


const unsigned char tb_key_edit[]={
	KEY_CODE_NULL,			//KEY_CODE_NULL=0,	//0
	KEY_CODE_UP,			//KEY_CODE_UP,		//1
	KEY_CODE_DOWN,			//KEY_CODE_DOWN,	//2
	KEY_CODE_LEFT,			//KEY_CODE_LEFT,	//3
	KEY_CODE_RIGHT,			//KEY_CODE_RIGHT,	//X
	KEY_CODE_OK,			//KEY_CODE_OK,		//5
	KEY_CODE_CANCEL			//KEY_CODE_CANCEL,	//X
};


#define MENU_SET_NB	16//设定菜单号

unsigned char key_code_convert(unsigned char key_code_org)
{
	unsigned char r=KEY_CODE_NULL;
	
	switch(g_menu.menu.layer)
	{
		case DISP_LAYER_BASIC:
			if(!(key_code_org & KEY32_CODE_LONGMARK))				//基本层，没有长按键
			{
				r=tb_key_basic[key_code_org];						//查找按键功能
			}
			else if(key_code_org == KEY_CODE_LEFT + KEY32_CODE_LONGMARK)
			{
				Menu_Mono_NewMenu(&g_menu.menu,MENU_SET_NB,0);		//在任何菜单按下设定长键，切换至设定菜单
				r=KEY_CODE_OK;
			}
			break;
		case DISP_LAYER_SEL:			//选择变量层
			if(!(key_code_org & KEY32_CODE_LONGMARK))
			{
				r=tb_key_sel[key_code_org];
			}
			else if(key_code_org == KEY_CODE_LEFT + KEY32_CODE_LONGMARK)
			{
				r=KEY_CODE_CANCEL;
			}
			break;
		case DISP_LAYER_EDIT:		//编辑层
			if(!(key_code_org & KEY32_CODE_LONGMARK))
			{
				r=tb_key_edit[key_code_org];
			}
			else if(key_code_org == KEY_CODE_LEFT + KEY32_CODE_LONGMARK)
			{
				r=KEY_CODE_CANCEL;
			}
			break;
	}
	return(r);
}


__weak unsigned char func_menu_key_code_before(FUNC_MENU_T *p, unsigned char key_code)
{
	/*
	只有4按键的时候，在选择层与编辑层切换
	if(p->menu.layer >= DISP_LAYER_SEL && key_code == KEY_CODE_RIGHT) 
	{
		key_code = KEY_CODE_UP;
	}
	*/
	return(key_code);
}



//菜单进程
void func_menu(FUNC_MENU_T *p)
{
	unsigned char key_code;
	unsigned char b_key;
	//-----------------------------------------------------------------
	//按键代码根据当前的菜单重新转换
	key_code=get_key32_code(&g_key.key.key_code);		//取原始键值
	
	key_code=func_menu_key_code_before(p,key_code);
	
	key_code=key_code_convert(key_code);				//键值转换（在不同的菜单层，按键有不同的功能）

	b_key=key_code;
	//-----------------------------------------------------------------
	//密码超时取消操作
	if(key_code != KEY_CODE_NULL)
	{
		left_ms_set(&p->menu.lock_tm,MENU_SET_TOUT);		//有按键，设定时
	}
	else if(left_ms(&g_menu.menu.lock_tm)==0)
	{														//按键超时
		p->menu.lock_level=LOCK_LEVEL_DEFAULT;					//锁定密码
		if(p->menu.cur_menu == MENU_NB_SET && p->menu.layer >= DISP_LAYER_SEL)	//正在设定页面，退出设定界面回到基本层
		{
			Menu_Mono_Layer_BAsic(&p->menu);
		}
	}
	//-----------------------------------------------------------------------------------------------------
	switch(p->menu.layer)
	{
		case DISP_LAYER_BASIC:
			p->menu.lock_level=LOCK_LEVEL_DEFAULT;					//锁定密码
			key_code=Menu_Mono_Basic(&p->menu,key_code);
			break;
		case DISP_LAYER_SEL:			//选择变量层
			key_code=Menu_Mono_Sel(&p->menu,key_code);
			break;
		case DISP_LAYER_EDIT:
			key_code=Menu_Mono_Edit(&p->menu,key_code);
			break;
	}
	//-------------------------------------------------------------------------------------------------------
	//刷新时间到或者有按键，马上执行一次页面解析
	if(left_ms(&p->t_disp)==0 || b_key)
	{		
		left_ms_set(&p->t_disp,T_DISP_MS);
		Menu_Mono_DispPage(&p->menu);				//显示当前元件
	}
	//-------------------------------------------------------------------------------------------------------
}





